import {PagesOptions, PagesOptionsPage, PagesOptionsPageStyle} from "./pages";

/**
 * 页面类型，支持的页面文件后缀
 */
export type PageFileType = 'vue' | 'nvue' | 'uvue';

/**
 * 页面配置
 */
export interface PageConfig {
  /**
   * 页面样式
   */
  style?: PagesOptionsPageStyle;
  /**
   * 是否需要登录才可访问
   */
  needLogin?: boolean;
}

/**
 * 分包配置
 */
export interface SubPackagesOptions {
  /**
   * 分包根目录
   */
  root: string;
  /**
   * 分包页面配置，如果配置，则优先使用配置，否则自动构建
   */
  pages?: PagesOptionsPage[],
}

export type PagesOtherOptions = Omit<PagesOptions, 'pages' | 'subPackages'>;

/**
 * 插件配置选项
 */
export interface AutoPagesPluginOptions {
  /**
   * 项目根目录，应该与vite.root一致，默认自动获取当前根目录
   */
  root?: string;
  /**
   * 入口目录，默认：src
   */
  entryDir?: string;
  /**
   * 主包入口（相对于入口目录），默认：pages
   */
  mainDir?: string;
  /**
   * 主页面路径，默认：'pages/index/index'
   */
  mainPage?: string;
  /**
   * 要扫描的文件类型，默认为 ['vue', 'nvue', 'uvue']
   */
  fileTypes?: PageFileType[];
  /**
   * 忽略的路径，类似于 .gitignore，默认：['\*\*\/components\/\*\*']
   */
  ignore?: string[];
  /**
   * 输出路径，默认为项目根目录的 src/pages.json
   */
  outputPath?: string;
  /**
   * 生成pages类型文件，默认：false
   */
  generateTypes?: boolean;
  /**
   * pages类型文件输出路径，默认：src/uni-pages.d.ts
   */
  typesOutputPath?: string;
  /**
   * 默认页面配置
   *
   * 默认：
   * ```json
   * {
   *     style: {
   *       navigationStyle: 'custom'
   *     }
   * }
   * ```
   */
  defaultPageConfig?: PageConfig;
}

/**
 * 插件配置选项
 */
export type AutoPagesPluginInternalOptions = AutoPagesPluginOptions & {
  root: string;
  entryDir: string;
  mainDir: string;
  mainPage: string;
  fileTypes: PageFileType[];
  outputPath: string;
  generateTypes: boolean;
  typesOutputPath: string;
  /**
   * pages.json 路径
   */
  pagesJsonPath: string;
}

/**
 * 配置文件接口，包含用户在 pages.config.ts 中可以导出的所有配置
 */
export interface AutoPagesOptions extends PagesOtherOptions {
  /**
   * 页面配置，如果配置，则优先使用配置，否则自动构建
   */
  pages?: PagesOptionsPage[],
  /**
   * 分包配置
   */
  subPackages?: SubPackagesOptions[];
}
